import javax.swing.*;
import java.awt.*;
import java.sql.*;
// / ￣￣￣＼　
// |　ー　ー \　
// |　 ◉　◉ |  / ￣￣￣￣￣￣＼
// \ 　 ▱　 / ∠    这是主类   \
//  ＼  イ  \      如无必要别动 /
//  ／　  　＼  \______________/
// /　|　　 \ \　
// |　|　　 | |
// 程序主类
public class Main {

	// 数据库连接对象
	public static Connection conn = null;
	// 当前用户在服务器中的权限等级
	// 0=未登录
	// 1=报表(查看全部数据，不能编辑任何数据)
	// 2=员工(可以查看部分数据，可以编辑部分数据)
	// 3=前台(权限为查询所有数据，可以编辑全部数据)
	// 4=超管(绝对控制权，可以给任意人授权或收回权限)
	public static byte Permissions = 0;
	// 用户名
	public static String UserName = "";
	// 服务器地址+端口号
	public static String Server = "";
	// 左右面板
	public static JPanel panel1 = null;// 左侧面板
	public static JPanel panel2 = null;// 右侧面板
	// 窗口对象
	public static JFrame window = null;

	public static void MainPage() throws Exception {
		// 创建主窗体
		window = new JFrame();//创建一个窗口
		// 设置窗体大小720p
		window.setSize(1280, 720);
		// 设置窗体居中显示
		window.setLocationRelativeTo(null);
		// 设置窗体不可修改大小
		// window.setResizable(false);
		// 设置窗体标题
		{// 这里要用几个临时变量，设置在栈上节约内存
			String title = "工作主页面，当前用户：" + UserName;
			switch (Permissions) {
				case 0:title += " ;权限:" + "权限获取失败";break;// 如果服务端没有权限表则显示
				case 1:title += " ;权限:" + "报表";break;
				case 2:title += " ;权限:" + "客房服务";break;
				case 3:title += " ;权限:" + "前台";break;
				case 4:title += " ;权限:" + "超管";break;
				default:title += " ;权限:" + "未知权限";break;// 你听说过一个测试工程师进入一家酒吧的故事吗？
			}
			title += " ;服务器:" + Server;
			window.setTitle(title);	
		}
		// 创建两个JPanel面板，使用分割布局JSplitPane，一个用于显示控件，一个用于显示内容,左右分割
		JSplitPane split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true);
		split.setDividerLocation(300);
		panel1 = new JPanel();
		panel2 = new JPanel();
		split.add(panel1);// 添加左边面板(用于显示控件)
		split.add(panel2);// 添加右边面板(用于直接显示房间信息)
		window.add(split);
		// 创建网格布局，行数不固定，列数固定为8列
		GridLayout grid = new GridLayout(0, 8);
		panel2.setLayout(grid);
		// 添加滚动条
		JScrollPane scroll = new JScrollPane(panel2);
		split.add(scroll, JSplitPane.RIGHT);
		RoomManagement.UpdateRoomData();// 更新房间数据
		Menu.init();// 初始化菜单
		// 窗体创建完毕，显示窗体
		window.setVisible(true);
		// 检测窗体是否关闭，如果没关闭则一直等待
		while (window.isVisible()) {
			Thread.sleep(100);
		}	
	}
	// 入口函数，唯一作用是启动login函数和最后的错误兜底处理
	public static void main(String[] args) throws Exception {
        System.out.println("客户端启动中....");
		//加载及注册驱动,数据库为mariaDB,所以使用org.mariadb.jdbc.Driver
		Class.forName("org.mariadb.jdbc.Driver");
		System.out.println("数据库驱动使用mariaDB");
		try {
			Login.init();
			// 检查数据库对象是否连接正常
			if (conn == null) 
			{
				System.out.println("用户取消了登录\n客户端已结束");
				System.exit(0);
			}
			System.out.println("客户端登录成功");
			MainPage();// 启动主界面
		}
		catch (Exception e) {
			e.printStackTrace();//打印日志信息
			System.out.println("客户端发生致命错误导致无法正常运行，请联系管理员并将运行日志发送给他");
			// 弹窗提示错误信息
			JOptionPane.showMessageDialog(null, "客户端发生致命错误导致无法正常运行，请联系管理员并将运行日志发送给他", "错误", JOptionPane.ERROR_MESSAGE);
			System.exit(0);//退出程序
		}
		// 程序结束
		System.out.println("客户端已结束");
		System.exit(0);
    }
}